<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 封装集合类
    function Set () {
      // 属性
      this.items = {}

      // 方法
      // add方法
      Set.prototype.add = function (value) {
        // 判断当前集合中是否已经包含了该元素
        if (this.has(value)) {
          return false
        }

        // 将元素添加到集合中
        this.items[value] = value
        return true
      }

      // has方法
      Set.prototype.has = function (value) {
        return this.items.hasOwnProperty(value)
      }

      // remove方法
      Set.prototype.remove = function (value) {
        // 判断该集合中是否包含该元素
        if (!this.has(value)) {
          return false
        }

        // 将元素从属性中删除
        delete this.items[value]
        return true
      }

      // clear方法
      Set.prototype.clear = function () {
        this.items = {}
      }

      // size方法
      Set.prototype.size = function () {
        return Object.keys(this.items).length
      }

      // 获取集合中所有的值
      Set.prototype.values = function () {
        return Object.keys(this.items)
      }

      // 集合间的操作
      // 并集
      Set.prototype.union = function (otherSet) {
        // this: 集合对象A
        // otherSet: 集合对象B
        // 创建新的集合
        var unionSet = new Set()

        // 将A集合中所有的元素添加到新集合中
        var values = this.values()
        for (var i = 0; i < values.length; i++) {
          unionSet.add(values[i])
        }
        
        // 取出B集合中元素 判断是否需要添加到新集合
        values = otherSet.values()
        for (var i = 0; i < values.length; i++) {
          unionSet.add(values[i])
        }
        
        return unionSet
      }

      // 交集
      Set.prototype.intersection = function (otherSet) {
        // 创建新的集合
        var intersectionSet = new Set()

        // 从A中取出一个个元素 判断是否同时存在集合B中 存在放入新集合中
        var values = this.values()
        for (var i = 0; i < values.length; i++) {
          var item = values[i]
          if (otherSet.has(item)) {
            intersectionSet.add(item)
          }
        }

        return intersectionSet
      }

      // 差集
      Set.prototype.difference = function (otherSet) {
        var differenceSet = new Set()

        var values = this.values()
        for (var i = 0; i < values.length; i++) {
          var item = values[i]
          if (!otherSet.has(item)) {
            differenceSet.add(item)
          }
        }

        return differenceSet
      }
    }

    // 测试Set类
    // 创建Set类对象
    var set = new Set()

    // 添加元素
    set.add('a')
    set.add('a')
    set.add('b')
    set.add('c')
    alert(set.values())
    // alert(set.has('b'))

    // set.remove('b')
    // alert(set.values())

    // set.clear()
    // alert(set.values())
    // alert(set.size())

    var otherSet = new Set()
    otherSet.add('a')
    otherSet.add('s')
    otherSet.add('d')

    // 并集
    var unionSet = set.union(otherSet)
    alert(unionSet.values())

    // 交集
    var intersectionSet = set.intersection(otherSet)
    alert(intersectionSet.values())

    // 差集
    var differenceSet = set.difference(otherSet)
    alert(differenceSet.values())
  </script>
</body>
</html>